package com.lcp.ui;


import com.lcp.core.Context;
import com.lcp.core.ControlledStage;
import com.lcp.core.MySystemTray;
import com.lcp.utils.InfoUtil;
import com.lcp.utils.R;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import netscape.javascript.JSObject;

import java.util.HashMap;

import static com.lcp.ui.MainController.getMainController;

public class StageController {


    public StageController() {
        Context.controllers.put(this.getClass().getSimpleName(), this);
    }

    /**
     * 建立一个专门存储Stage的Map，全部用于存放Stage对象
     */
    private HashMap<String, Stage> stages = new HashMap<>();

    /**
     * 将加载好的Stage放到Map中进行管理
     *
     * @param name  设定Stage的名称
     * @param stage Stage的对象
     */
    public void addStage(String name, Stage stage) {
        stages.put(name, stage);
    }


    /**
     * 通过Stage名称获取Stage对象
     *
     * @param name Stage的名称
     * @return 对应的Stage对象
     */
    public Stage getStage(String name) {
        return stages.get(name);
    }


    /**
     * 将主舞台的对象保存起来，这里只是为了以后可能需要用，目前还不知道用不用得上
     *
     * @param primaryStageName 设置主舞台的名称
     * @param primaryStage     主舞台对象，在Start()方法中由JavaFx的API建立
     */
    public void setPrimaryStage(String primaryStageName, Stage primaryStage) {
        this.addStage(primaryStageName, primaryStage);
    }


    /**
     * 加载窗口地址，需要fxml资源文件属于独立的窗口并用Pane容器或其子类继承
     *
     * @param name      注册好的fxml窗口的文件
     * @param resources fxml资源地址
     * @param styles    可变参数，init使用的初始化样式资源设置
     * @return 是否加载成功
     */
    public boolean loadStage(String name, String resources, StageStyle... styles) {
        try {
            //加载FXML资源文件
            FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(resources));
            Pane tempPane = loader.load();

            //通过Loader获取FXML对应的ViewCtr，并将本StageController注入到ViewCtr中
            ControlledStage controlledStage = loader.getController();
            controlledStage.setStageController(this);

            //构造对应的Stage
            Scene tempScene = new Scene(tempPane);
            Stage tempStage = new Stage();
            Image icon = new Image(R.iconRes, 32, 32, false, false);
            tempStage.getIcons().add(icon);
            if (name.equals("MainView")) {
                tempStage.setTitle(R.APPNAME);
                tempStage.setOnCloseRequest(event -> {
                    tempStage.setIconified(true);
                    event.consume();
                });
                MySystemTray.getInstance(tempStage);
            }
            tempStage.setScene(tempScene);
            //配置initStyle
            for (StageStyle style : styles) {
                tempStage.initStyle(style);
            }

            //将设置好的Stage放到HashMap中
            this.addStage(name, tempStage);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 显示Stage但不隐藏任何Stage
     *
     * @param name 需要显示的窗口的名称
     * @return 是否显示成功
     */
    public boolean setStage(String name) {
        System.out.println(name + "显示");
        this.getStage(name).show();
        return true;
    }


    /**
     * 显示Stage并隐藏对应的窗口
     *
     * @param show  需要显示的窗口
     * @param close 需要删除的窗口
     * @return
     */
    public boolean setStage(String show, String close) {
        getStage(close).close();
        setStage(show);
        return true;
    }


    /**
     * 在Map中删除Stage加载对象
     *
     * @param name 需要删除的fxml窗口文件名
     * @return 是否删除成功
     */
    public boolean unloadStage(String name) {
        if (stages.remove(name) == null) {
            System.out.println("窗口不存在，请检查名称");
            return false;
        } else {
            System.out.println("窗口移除成功");
            return true;
        }
    }




    /** 用于与Javascript引擎通信。 */
    public JSObject javascriptConnector;
    /** 用于从Javascript引擎进行通信。 */
    public JavaConnector javaConnector = new JavaConnector();
    protected WebEngine webEngine = null;
    protected static int countOfWebEngine = 0;
    public WebEngine initCenterWebView(WebView centerWebView,String pageName) {
        //获取Engine
        if (webEngine==null){
            webEngine = centerWebView.getEngine();
        }
        countOfWebEngine++;
        try {
            if (countOfWebEngine==1){
               //DevToolsDebuggerServer.startDebugServer(webEngine.impl_getDebugger(), 51742);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        com.sun.javafx.webkit.WebConsoleListener.setDefaultListener(new com.sun.javafx.webkit.WebConsoleListener() {
            @Override
            public void messageAdded(WebView webView, String message, int lineNumber, String sourceId) {
                System.out.println("Console: " + message + " [" + sourceId + ":" + lineNumber + "] ");
            }
        });
        webEngine.setJavaScriptEnabled(true);
        //获取当前Java版本
        System.out.println("Java Version:" + System.getProperty("java.runtime.version"));
        //获取当前JavaFx版本
        System.out.println("JavaFXersion:" + System.getProperty("javafx.runtime.version"));
        //获取当前系统版本
        System.out.println("OS:" + System.getProperty("os.name") + "," + System.getProperty("os.arch"));
        //获取WebKit内核版本
        System.out.println("User Agent:" + centerWebView.getEngine().getUserAgent());
        //获取页面路径
        String mainUrl = getClass().getResource("/pages/layout/"+pageName).toExternalForm();
        //获取页面alert弹窗和重新加载页面
        webEngine.setOnAlert(event -> InfoUtil.showAlert(event.getData()));
        webEngine.setConfirmHandler(message -> InfoUtil.showConfirm(message));
        //初始化
        webEngine.load(mainUrl);
        return webEngine;
    }


    public class JavaConnector {


        /**
         * 让JavaScript调用的方法
         *
         * @param value 网页传过来的值
         */
        public void showPosInStatus(String value) {
            if (null != value) {
                // 这里收到了JavaScript传来的数据，再传送一个值回去给JavaScript
                //Platform.runLater(()->runStatus.setText(value));
                System.out.println(value);
            }
        }
        public void showPosListInConsole(String value) {
            if (null != value) {
                // 这里收到了JavaScript传来的数据，再传送一个值回去给JavaScript
//                Platform.runLater(()->console.setText(value));
                System.out.println(value);
            }
        }
        public void getData(String value) {
            System.out.println("getData:"+value);
            if (null != value) {
                // 这里收到了JavaScript传来的数据，再传送一个值回去给JavaScript
                //Platform.runLater(()->console.setText(value));
                //drawDxf(Menuview1Controller.dxfContent);
            }
        }
    }

    public int drawDxf(String etjStr){
        if(javascriptConnector!=null){
            javascriptConnector.call("drawPicFromJava",etjStr);
            return 1;
        }
        return 0;
    }

}
